package com.java.core.reflectd;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * @Author YongQiang
 * @Date 2021/9/26 14:23
 * @Version 1.0
 */
public class ReflectTest {
    public static void main(String[] args) throws ClassNotFoundException {

        // 获得class对象的三种方式
        ReflectTest instance = new ReflectTest();
        Class<? extends ReflectTest> aClass = instance.getClass();
        Class<ReflectTest> reflectTestClass = ReflectTest.class;
        Class<?> aClass1 = Class.forName("com.java.core.reflectd.ReflectTest");


        // getName方法应用于数组类型的时候返回
        // [Ljava.lang.Double;
        System.out.println(Double[].class);
        // [I
        System.out.println(int[].class);


        // getConstructors、getFields、getMethods返回的都是公有类型，也包括父类的公有成员
        // 带上Declared会额外包括private以及protected类型的，但是不包括父类成员
        Class<Target> targetClass = Target.class;
        for (Constructor<?> constructor : targetClass.getConstructors()) {
            // 获取构造名称
            constructor.getName();
            int modifiers = constructor.getModifiers();
            System.out.println(constructor.getName() +" mod :"+modifiers);

        }
        for (Field field : targetClass.getFields()) {
            // 获取属性名称
            System.out.println(field.getName());
            // 获取属性的Class类型
            Class<?> type = field.getType();
            int modifiers = field.getModifiers();
            System.out.println(field.getName() +" mod :"+modifiers);
            System.out.println(modifiers);
        }
        for (Method method : targetClass.getMethods()) {

            // 获取method名称
            System.out.println(method.getName());
            // 获取method返回类型
            System.out.println(method.getReturnType());

            // 返回int型，用不同的位开关描述public和static这样的描述符使用情况
            int modifiers = method.getModifiers();
            System.out.println(method.getName() +" mod :"+modifiers);
            System.out.println(method.getName() +"is Public ? "+Modifier.isPublic(modifiers));
            System.out.println(method.getName() +"is Abstract ? "+Modifier.isAbstract(modifiers));
            System.out.println(method.getName() +"is Static ? "+Modifier.isStatic(modifiers));
            System.out.println(method.getName() + " print "+Modifier.toString(modifiers));
        }


    }
}
